/*
ref : https://www.cnblogs.com/dylancao/p/8472879.html

 在操作系统中，经常会用到判断大小端，很多面试题中也会经常遇到，以前的时候没有总结过，这里总结一下。以后用到了就直接可以用了。

所谓的大小端，大致的解释意思就是：

【大端模式】 CPU对操作数的存放方式是高地址存放低位，低地址存放高位。

【小端模式】CPU对操作数的存放方式是高地址存放高位，低地址存放低位。

大多数ARM处理器都是采用的小端模式，PowerPC是采用的大端模式，网络字节序是采用的大端模式。
*/

//　常用的有两种方式来判断大小端，一种是使用C语言中的联合体，具体代码如下：
int check_endian_by_cpu(void)
{
    union w
    {
        int a;
        char b;
    }c;

    c.a = 1;
    return (c.b == 0); // 大端返回TRUE,小端返回FALSE
}

//其中，linux内核中就是使用这部分的代码，代码如下所示：
static union { 
    char c[4]; 
    unsigned long mylong; 
}endian_test = {{ 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.mylong)


//另外一种就是使用指针的方式，具体代码如下所示：
int check_endian_by_pointer(void)
{
    int i = 1;   
    unsigned char *pointer;   

    pointer = (unsigned char *)&i;   

    if(*pointer)   
    {   
        // printf("little_endian");   
        return 0;
    }else   
    {   
        // printf("big endian/n");   
        return 1;
    }

    return 0;
}



#if 1  
// for demo
#include <stdio.h>
int main(void)
{
    int ret;
    printf("check_endian_by_pointer \n");
    ret = check_endian_by_pointer();
    if(!ret)   
    {   
        printf("little endian\n");   
    }else   
    {   
        printf("big endian\n");   
    }

    printf("check_endian_by_cpu \n");
    ret = check_endian_by_cpu();
    if(!ret)   
    {   
        printf("l\n");   
    }else   
    {   
        printf("b\n");   
    }

    printf("check_endian_by_macro [1]\n");
    printf("%c\n", ENDIANNESS);

    printf("check_endian_by_macro [2]\n");
    ret = ENDIANNESS;
    if(ret == 'l')   
    {   
        printf("l\n");   
    }else   
    {   
        printf("b\n");   
    }
    return ret;
}

#endif
